Newer
Older
client_dwatch / app / api / ds-agent / commands / [command_id] / result / route.ts
/**
 * POST /ds-agent/commands/{command_id}/result — 一覧の結果(指示書AY 段階7-3。D-179)
 *
 * 仕様の正は `d-watch-api.yaml` の同パス。本体は4MB以下(★読んだ長さで判定。W8★)・2万件以下。
 * ★形の誤りは制御盤へ 400 `result_invalid`。同時にブラウザの一覧を 502(`agent_code` は `result_invalid`)で終わらせ、指示は消える★(指示書BJ J2)。
 */
import { NextResponse } from "next/server";
import { agentCommandPreamble, commandNotFound, jsonError, noContent } from "@/lib/ds-agent/agent-request";
import { getRelay } from "@/lib/ds-agent/relay";
import { ensureDsAgentLogging } from "@/lib/ds-agent/relay-log";
import { parseAgentListResult } from "@/lib/ds-logs/validate";
import { withRequestId } from "@/lib/logger";

export async function POST(request: Request, { params }: { params: Promise<{ command_id: string }> }) {
  return withRequestId(request, async () => {
    ensureDsAgentLogging();
    const pre = await agentCommandPreamble(request, (await params).command_id);
    if (!pre.ok) return pre.response;

    const parsed = parseAgentListResult(await request.text());
    if (!parsed.ok) {
      // ★戻り値によらず制御盤には 400(指示書BJ 罠2)★
      getRelay().rejectListResult(pre.serial, pre.commandId);
      return NextResponse.json(parsed.error, { status: parsed.status });
    }

    switch (getRelay().submitListResult(pre.serial, pre.commandId, parsed.query)) {
      case "ok":
        return noContent();
      case "gone":
        return jsonError(410, "command_expired", "指示の期限が切れています");
      case "not_found":
        return commandNotFound();
    }
  });
}